package org.candyteam.lgw.skills.generictype.skill01;

/**
 * 这种形式，用来限定子类实现父类方法时方法的签名类型
 * @param <T>
 */
public abstract class FrameworkMember<T extends FrameworkMember<T>> {
    // abstract boolean isShadowedBy(FrameworkMember otherMember);

    /**
     * 为什吗不使用上面的形式？
     * 个人理解：
     * FrameworkMember「FMB」 是 FrameworkMethod「FMD」 和 FrameworkField「FFD」 抽象父类。还是那句话FMD、FFD是FMB，但是反过来不成立。
     * 子类实现 isShadowedBy 如果需要FMD、FFD中的特性要素支持，方法签名简单的使用父类作为参数类型显然是不合适的
     * 比如
     *
     *     @Override
     *     public boolean isShadowedBy(FrameworkField otherMember) {
     *         // FMD、FFD公共要素，已经抽象到FMB中
     *         return otherMember.getName().equals(getName());
     *     }
     *
     *     @Override
     *     public boolean isShadowedBy(FrameworkMethod other) {
     *         // FMD、FFD公共要素，已经抽象到FMB中
     *         if (!other.getName().equals(getName())) {
     *             return false;
     *         }
     *
     *         // FrameworkMethod 中的特性要素
     *         if (other.getParameterTypes().length != getParameterTypes().length) {
     *             return false;
     *         }
     *         for (int i = 0; i < other.getParameterTypes().length; i++) {
     *             if (!other.getParameterTypes()[i].equals(getParameterTypes()[i])) {
     *                 return false;
     *             }
     *         }
     *         return true;
     *     }
     */
    abstract boolean isShadowedBy(T otherMember);
}